PHP cookiekaping en andere risico's
Cookies zelf zijn onschadelijk omdat ze geen code kunnen en ook geen virussen kunnen bevatten of uitvoeren. Maar indirect kunnen cookies wel de oorzaak zijnvan kwaadwillende activiteiten waarbij jouw gegevens zijn betrokken.
Het zijn slechts tekstbestanden maar ze zijn uiterst kwetsbaar voor cookie-aanvallen. Andere toepassingen, spionagesoftware en andere cookies kunnen persoonlijke informatie zoals locatie, wachtwoorden, auto-aanvulgegevens, enz. verzamelen uit de cookies op jouw computer en deze informatie kwaadwillig gebruiken.
HTTP cookies
Cookies worden verstuurd in HTTP headers:
- Server response
HTTP/1.1 200 OK ... Set-Cookie: userName=Jef
- Daaropvolgend client request
GET /index.html HTTP/1.1 ... Cookie: userName=Jef;
Cookie-kaping
De ongeautoriseerde toegang tot cookies heet "cookie-kaping" (cookie hijacking).
Als de hacker op de een of andere manier de sessie of permanente cookies in handen krijgt, is dat gevaarlijk omdat deze cookie-kaping een mogelijke dreiging vormt van ongeautoriseerde toegang tot websites waarop je eerder bent aangemeld. Met de gestolen cookies kan de hacker toegang krijgen tot de account van de gebruiker zonder inloggegevens in te voeren.
Cookiebeveiliging is een groot probleem in de internetwereld. Er worden steeds beveiligingslekken gevonden in verschillende browsers die onbedoeld persoonlijke informatie kunnen lekken naar kwaadwillende gebruikers.
Hoewel je cookies niet voor alle websites moet uitschakelen, aangezien deze mogelijk cookies nodig hebben voor een goede werking, kunt u cookies van derden zeker uitschakelen in uw browserinstellingen. Maak uw cache regelmatig leeg en blijf voorzichtig wanneer u onbekende websites bezoekt en daar uw persoonlijke gegevens doorgeeft.
Kwetsbaarheden
Denk eraan om, afhankelijk van de cookie-inhoud, de veiligheidsinstellingen voor cookies in te stellen. Dit is vooral belangrijk voor sessiecookies.
- De man-in-the-middle-aanval
Cookies, die niet als
secure
zijn gemarkeerd, kunnen worden overgedragen via een niet-versleutelde verbinding. Een man-in-the-middle-aanval kan worden gebruikt om de inhoud van deze cookies te achterhalen. Je kan cookies als secure markeren op 2 manieren:opmerking:
het attribuut
Secure
beschermt alleen de vertrouwelijkheid van een cookie tegen MiTM-aanvallers - er is geen integriteitsbescherming! - Cross-Site-Scripting (XSS)
Cookies die niet zijn gemarkeerd als
HTTPOnly
, kunnen worden gelezen door lokale scripts. In het geval van een Cross-Site-Scripting (XSS) aanval kan de aanvaller deze cookies lezen.opmerking: problemen met het
HttpOnly
-attribuut- alleen vertrouwelijkheid in de praktijk beschermd
- HttpOnly-cookies kunnen worden vervangen door de koektrommel vanuit JavaScript te laten overlopen
- Het bereik van een cookie
HetPath
attribuut beperkt het bereik van een cookie tot een specifiek pad op de server en kan daarom worden gebruikt om ongeautoriseerde toegang te verhinderen vanuit andere websites op dezelfde host. - Cookiedomein
Het
domain
attribuut geeft een subdomein aan van servers die de cookie mogen zien. Wanneer het cookiedomein niet is ingesteld gebruikt de browser exact hetzelfde domein van de URL.opmerkingen:
- als het domein is ingesteld, worden cookies naar dat domein en al zijn subdomeinen gestuurd;
- het risico met subdomeinen is kleiner dan wanneer het bereik naar het bovenliggende domein beperkt is, maar nog steeds relevant
- verwijder het domein attribuut om de cookie te beperken tot de oorspronkelijke host alleen
- Het SameSite attribuut
- Probleem: cookies worden met alle verzoeken naar een server gestuurd, ongeacht de herkomst van het verzoek en aanvallers kunnen hiervan misbruik maken door geauthenticeerde cross-origin-verzoeken te initiëren, bijv. CSRF, XSSI, enz.
- Oplossing: nieuw cookie attribuut
SameSite = [Strict | Lax]
, voorkomt dat cookies worden gekoppeld aan cross-origin-verzoeken
- Het lifetime/expires attribuut is optioneel;
- het kan worden gebruikt om de vervaltijd van de cookie in te stellen, bijvoorbeeld 1 uur. De tijd wordt ingesteld met behulp van de PHP-functie
time
plus of min een aantal seconden groter dan 0, bijvoorbeeldtime() + 3600
voor 1 uur. - indien het attribuut een negatieve waarde heeft, stuurt de server een antwoord met het verzoek de cookie te verwijderen;
- het kan worden gebruikt om de vervaltijd van de cookie in te stellen, bijvoorbeeld 1 uur. De tijd wordt ingesteld met behulp van de PHP-functie
- Cookievoorvoegsels
- Probleem: server ziet alleen cookienaam en -waarde in het HTTP-verzoek, geen informatie over de attributen ervan, de server kan niet weten of een cookie die hij ontvangt veilig is ingesteld
- Oplossing: smokkel informatie naar server in cookienaam door gebruik te maken van prefixen:
__Secure-
en__Host-
Cookienamen met het voorvoegsel
__Secure-
of__Host-
kunnen alleen worden gebruikt als ze zijn ingesteld met hetsecure
attribuut voor een veilige (HTTPS) oorsprong.Bovendien moeten cookies met het voorvoegsel
__Host-
eenPath
attribbut hebben ingesteld op / (dat wil zeggen elk pad op de host) en mogen ze geenDomain
-attribuut hebben.
Cookies versturen vanaf de server met PHP
- Cookies: setcookie
Deze functie kan je op twee manieren gebruiken:- met individuele parameters:
setcookie(string $name , string $value = "" , int $expires = 0 , string $path = "" , string $domain = "" , bool $secure = false , bool $httponly = false) : bool
bijvoorbeeld:
setcookie('userName', $userName, 0, '/Testers', '', false, true);
-
of met een
$options
array (vanaf PHP 7.3.0). Let erop dat er 1 paramger bijgekomen is, namelijksamesite
:setcookie ( string $name , string $value = "" , array $options = [] ) : bool
Per default ziet de
$options
array er zo uit:$cookieParams = array( 'expires' => 0, 'path' => "/", 'domain' => '', 'secure' => false, 'httponly' => false, 'samesite' => '');
Om de cookie in te stellen op
HttpOlny
,SameSite=Strict
en te laten verlopen na 5 seconden:$cookieParams = array( 'expires' => time() + 5, 'path' => '/', 'domain' => '', 'secure' => false, 'httponly' => true, 'samesite' => 'Strict'); setcookie('userName', $userName, $cookieParams);
Om een cookie te verwijderen maak je een cookie met dezelfde naam en zet je de waarde ervan in op een lege string en de verlooptijd in op een moment ergens in het verleden:
$cookieParams = array( 'expires' => time() - 42000, 'path' => '/', 'domain' => '', 'secure' => false, 'httponly' => true, 'samesite' => 'Strict'); setcookie('userName', '', $cookieParams);
- met individuele parameters:
Bronnen
- WebsitePolicies, What Are Cookies & Why Are They Important, Updated on April 7, 2021
-
Stanford, CS 253 Web Security, Fall 2019
- David Johansson, Cookie Security Myths and Misconceptions –OWASP, London 30 Nov. 2017